package ppd;



/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;



/**
 *
 * @author houdemer
 */
public class BarmanImpl implements Barman, Runnable{

    public BarmanImpl(){ super();}

    public void deplacer(ArrayList<Table> a){
        int bestTable=0;
        double rapportMin=1.0;
        double rapportActuel;
        int index=0;

        try {
            if(a.size()==1){
		//System.out.println("Jetais sur un bord de letoile et je me deplace au centre");
                a.get(0).servir(this); //Si je suis sur un bord de l'etoile
	        return;
	    }
            for (Table t : a) {
                Buveur temp = t.buveurAssis();
                if (temp.getNiveauCourant() == 2) { //Si la personne ne tiendra pas le temps d'un aller-retour, je la sers en priorite
                    //System.out.println("Je suis le barman et je me deplace vers un client qui a tres soif! Index = "+index);
                    t.servir(this); //Je pars servir la table
		    return;
                }

		rapportActuel=temp.getRapport();
		//System.out.println("Pour le client numero "+index+" il a un rapport de "+rapportActuel);
                if ( rapportActuel < rapportMin) {
                    rapportMin = rapportActuel;
                    bestTable = index;
                }
                index++;
            }
            a.get(bestTable).servir(this);
	    return;
        }
        catch(RemoteException r){ System.err.println("Une erreur de type RemoteException est survenue lors du deplacement!"); System.exit(0);}
        catch(Exception e){ System.err.println("Une erreur de type "+e.getClass()+" est survenue dans le code du barman ... Le barman demissionne..."); System.exit(0);}
    }


    public synchronized void run() {
        String localIp=null;
        Table t = null;

        try {
            localIp = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException ex) {
            System.err.println("La recuperation de l'adresse IP locale a echoue."); System.exit(0);
        }
        try{
            t=(Table)Naming.lookup("//"+localIp+":10070/table");
        }
        catch(RemoteException r){ System.err.println("Une erreur de type RemoteException est survenue dans BarmanImpl.run()."); System.exit(0);}
        catch(MalformedURLException m){ System.err.println("L'url \"//"+localIp+":10070/table\" est mal formee."); System.exit(0);}
        catch(NotBoundException n){ System.err.println("L'objet n'est pas enregistre, cela doit signifier que le serveur l'a supprime car il l'a ete..."); System.exit(0);}
        catch(Exception e){ System.err.println("Une erreur de type "+e.getClass()+" est survenue lors de la recuperation de la table locale par le Barman... On a du tuer son RmiRegistry, il demissionne..."); System.exit(0);}
        try {
            t.buveurAssis().remplir();
            System.out.println("Barman (apres avoir servi son client) : Ouaip, j'arrive!");
            this.deplacer(t.tablesVoisines());
	    return;
        } catch (RemoteException ex) {
            System.err.println("Une erreur de type RemoteException est survenue au remplissage d'un buveur ou lors d'un deplacement!."); System.exit(0);
        }
        catch(Exception e){System.err.println("Une erreur de type "+e.getClass()+" est survenue dans le BarmanImpl.run()."); System.exit(0);}



    }
    
}
